انتقل إلى المحتوى الرئيسي

طباعة وصل الزبون (PrintCustomerReceiptEndpoint)

نظرة عامة

الكلاس هذا مسؤول عن تنفيذ وظيفة طباعة وصل الزبون .(API Endpoint) باستخدام FastEndpoints على الرابط:

POST /checkout/bill/print/customer-receipt

الخطوات اللي يسويها:

  1. يولّد بيانات الوصل بناءً على رقم الفاتورة.
  2. يضيف لوكو (شعار) إذا محدد بالإعدادات.
  3. يرسل الوصل للطابعة اللي موجود اسمها بالإعدادات.
  4. يحدّث حالة الفاتورة والتاريخ مالها.

هذي تشير إلى ملفات داخلية بالمشروع، مثل:

  • ReceiptGeneratorHelper: يولد بيانات الوصل.
  • BillHelper: يعدل حالة الفاتورة ويحفظ التاريخ.
  • IPrinterService: يطبع ويجيب الطابعة.
  • AppDbContext: قاعدة البيانات.
  • LocalFileSaverOptions: مسار حفظ الملفات.

تعريف الكلاس

public class PrintCustomerReceiptEndpoint : Endpoint<PrintRequest>

هذا كلاس يمثل API Endpoint، ويستقبل بيانات من نوع PrintRequest.


الكونستركتر (Constructor)

public PrintCustomerReceiptEndpoint(...)

ينحقن بالكلاس مجموعة خدمات (Dependencies):

الخدمةوظيفتها
ReceiptGeneratorHelperيولد بيانات الوصل.
BillHelperيغيّر حالة الفاتورة ويحفظ التاريخ.
IPrinterServiceيتعامل ويا الطابعة.
AppDbContextقاعدة البيانات.
IOptions<LocalFileSaverOptions>إعدادات لحفظ الملفات.

دالة Configure()

public override void Configure()
  • تحدد الرابط اللي راح يشتغل عليه (/checkout/bill/print/customer-receipt)
  • تربطه بصلاحية معينة (AppPerms.Monitor.PrintCustomerBill)، يعني بس المستخدمين اللي عدهم هاي الصلاحية يقدرون يستعملوه.

دالة HandleAsync

public override async Task HandleAsync(PrintRequest req, CancellationToken ct)

هنا يتم تنفيذ منطق الطباعة:

  1. جلب المستخدم من التوكن (JWT).

  2. توليد بيانات الوصل من GenerateReceipt.

  3. تشييك إذا اكو لوكو (شعار):

    • إذا موجود ويا الامتداد ماله، يستخدمه بالوصل.
    • إذا لا، يستخدم الوصل بدون لوكو.
  4. التأكد من وجود طابعة: إذا اسم الطابعة مو موجود بالإعدادات، يطلع خطأ.

  5. المحاولة للطباعة:

    • إذا فشلت، يرجع خطأ يقول الطابعة مو موجودة أو مو مربوطة.
  6. تحديث حالة الفاتورة إلى PrintedToCustomer.

  7. حفظ تاريخ الطباعة بالقاعدة.

  8. يرجّع رسالة: "Printed Successfully".


الملاحظات

  • لوكو الفاتورة يتم جلبه من جدول UploadedFiles.
  • الاسم مال الطابعة يتم جلبه من AppSettings.InvoiceSettings.PrinterName.
  • إذا الطابعة مو معرفة، يرجع خطأ فيه رسالة عربية مفهومة للمستخدم.

مثال على رسالة الخطأ

throw new ApiException("PrinterDoesNotExist", "حدث خطأ: لم تتم الطباعة.تأكد من ان الطابعة المحددة في الاعدادات موجودة او متصلة.", 400);

تعني: "صارت مشكلة بالطابعة، تأكد إنها مربوطة وموجودة".